<!DOCTYPE HTML>
<html lang="en" >
    
    <head>
        
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <title>lua语言介绍 | 课程介绍</title>
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
        <meta name="description" content="">
        <meta name="generator" content="GitBook 2.6.7">
        
        
        <meta name="HandheldFriendly" content="true"/>
        <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
        <meta name="apple-mobile-web-app-capable" content="yes">
        <meta name="apple-mobile-web-app-status-bar-style" content="black">
        <link rel="apple-touch-icon-precomposed" sizes="152x152" href="../gitbook/images/apple-touch-icon-precomposed-152.png">
        <link rel="shortcut icon" href="../gitbook/images/favicon.ico" type="image/x-icon">
        
    <link rel="stylesheet" href="../gitbook/style.css">
    
        
        <link rel="stylesheet" href="../gitbook/plugins/gitbook-plugin-highlight/website.css">
        
    
        
        <link rel="stylesheet" href="../gitbook/plugins/gitbook-plugin-search/search.css">
        
    
        
        <link rel="stylesheet" href="../gitbook/plugins/gitbook-plugin-fontsettings/website.css">
        
    
    

        
    
    
    <link rel="next" href="../chapter5/5.2_gtest单元测试.html" />
    
    
    <link rel="prev" href="../chapter5/index.html" />
    

        
    </head>
    <body>
        
        
    <div class="book"
        data-level="5.1"
        data-chapter-title="lua语言介绍"
        data-filepath="chapter5/5.1_lua语言介绍.md"
        data-basepath=".."
        data-revision="Wed Oct 31 2018 20:17:52 GMT+0800 (CST)"
        data-innerlanguage="">
    

<div class="book-summary">
    <nav role="navigation">
        <ul class="summary">
            
            
            
                
                <li>
                    <a href="http://www.0voice.com" target="blank" class="custom-link">ntyTcp</a>
                </li>
            
            

            
            <li class="divider"></li>
            

            
    
        <li class="chapter " data-level="0" data-path="index.html">
            
                
                    <a href="../index.html">
                
                        <i class="fa fa-check"></i>
                        
                        Introduction
                    </a>
            
            
        </li>
    
        <li class="chapter " data-level="1" data-path="chapter1/index.html">
            
                
                    <a href="../chapter1/index.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>1.</b>
                        
                        课程介绍和项目介绍
                    </a>
            
            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.1" data-path="chapter1/1.1_课程介绍.html">
            
                
                    <a href="../chapter1/1.1_课程介绍.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>1.1.</b>
                        
                        课程介绍
                    </a>
            
            
        </li>
    
        <li class="chapter " data-level="1.2" data-path="chapter1/1.2_项目介绍.html">
            
                
                    <a href="../chapter1/1.2_项目介绍.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>1.2.</b>
                        
                        项目介绍
                    </a>
            
            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="2" data-path="chapter2/index.html">
            
                
                    <a href="../chapter2/index.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>2.</b>
                        
                        搭建开发环境
                    </a>
            
            
            <ul class="articles">
                
    
        <li class="chapter " data-level="2.1" data-path="chapter2/2.1_安装和配置linux系统.html">
            
                
                    <a href="../chapter2/2.1_安装和配置linux系统.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>2.1.</b>
                        
                        安装和配置linux系统
                    </a>
            
            
        </li>
    
        <li class="chapter " data-level="2.2" data-path="chapter2/2.2_linux命令.html">
            
                
                    <a href="../chapter2/2.2_linux命令.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>2.2.</b>
                        
                        linux命令
                    </a>
            
            
        </li>
    
        <li class="chapter " data-level="2.3" data-path="chapter2/2.3_安装开发工具.html">
            
                
                    <a href="../chapter2/2.3_安装开发工具.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>2.3.</b>
                        
                        安装开发工具
                    </a>
            
            
        </li>
    
        <li class="chapter " data-level="2.4" data-path="chapter2/2.4_搭建开发环境.html">
            
                
                    <a href="../chapter2/2.4_搭建开发环境.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>2.4.</b>
                        
                        搭建开发环境
                    </a>
            
            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="3" data-path="chapter3/index.html">
            
                
                    <a href="../chapter3/index.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>3.</b>
                        
                        项目文档
                    </a>
            
            
            <ul class="articles">
                
    
        <li class="chapter " data-level="3.1" data-path="chapter3/3.1_如何管理需求.html">
            
                
                    <a href="../chapter3/3.1_如何管理需求.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>3.1.</b>
                        
                        如何管理需求
                    </a>
            
            
        </li>
    
        <li class="chapter " data-level="3.2" data-path="chapter3/3.1_如何架构设计.html">
            
                
                    <a href="../chapter3/3.1_如何架构设计.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>3.2.</b>
                        
                        如何架构设计
                    </a>
            
            
        </li>
    
        <li class="chapter " data-level="3.3" data-path="chapter3/3.3_共享单车架构设计.html">
            
                
                    <a href="../chapter3/3.3_共享单车架构设计.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>3.3.</b>
                        
                        共享单车的架构
                    </a>
            
            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="4" data-path="chapter4/index.html">
            
                
                    <a href="../chapter4/index.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>4.</b>
                        
                        敏捷开发
                    </a>
            
            
            <ul class="articles">
                
    
        <li class="chapter " data-level="4.1" data-path="chapter4/4.1_敏捷概述.html">
            
                
                    <a href="../chapter4/4.1_敏捷概述.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>4.1.</b>
                        
                        敏捷概述
                    </a>
            
            
        </li>
    
        <li class="chapter " data-level="4.2" data-path="chapter4/4.2_SCRUM介绍.html">
            
                
                    <a href="../chapter4/4.2_SCRUM介绍.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>4.2.</b>
                        
                        SCRUM介绍
                    </a>
            
            
        </li>
    
        <li class="chapter " data-level="4.3" data-path="chapter4/4.3_我们应该认识到.html">
            
                
                    <a href="../chapter4/4.3_我们应该认识到.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>4.3.</b>
                        
                        我们应该认识到
                    </a>
            
            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="5" data-path="chapter5/index.html">
            
                
                    <a href="../chapter5/index.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>5.</b>
                        
                        持续集成
                    </a>
            
            
            <ul class="articles">
                
    
        <li class="chapter active" data-level="5.1" data-path="chapter5/5.1_lua语言介绍.html">
            
                
                    <a href="../chapter5/5.1_lua语言介绍.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>5.1.</b>
                        
                        lua语言介绍
                    </a>
            
            
        </li>
    
        <li class="chapter " data-level="5.2" data-path="chapter5/5.2_gtest单元测试.html">
            
                
                    <a href="../chapter5/5.2_gtest单元测试.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>5.2.</b>
                        
                        gtest单元测试
                    </a>
            
            
        </li>
    
        <li class="chapter " data-level="5.3" data-path="chapter5/5.3_搭建持续集成环境.html">
            
                
                    <a href="../chapter5/5.3_搭建持续集成环境.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>5.3.</b>
                        
                        搭建持续集成环境
                    </a>
            
            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="6" data-path="chapter6/index.html">
            
                
                    <a href="../chapter6/index.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>6.</b>
                        
                        产品版本管理之git
                    </a>
            
            
        </li>
    
        <li class="chapter " data-level="7" data-path="chapter7/index.html">
            
                
                    <a href="../chapter7/index.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>7.</b>
                        
                        shell脚本
                    </a>
            
            
            <ul class="articles">
                
    
        <li class="chapter " data-level="7.1" data-path="chapter7/7.1_什么是shell.html">
            
                
                    <a href="../chapter7/7.1_什么是shell.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>7.1.</b>
                        
                        什么是shell
                    </a>
            
            
        </li>
    
        <li class="chapter " data-level="7.2" data-path="chapter7/7.2_Shell编程.html">
            
                
                    <a href="../chapter7/7.2_Shell编程.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>7.2.</b>
                        
                        Shell编程
                    </a>
            
            
        </li>
    
        <li class="chapter " data-level="7.3" data-path="chapter7/7.3_启动脚本实例.html">
            
                
                    <a href="../chapter7/7.3_启动脚本实例.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>7.3.</b>
                        
                        启动脚本实例
                    </a>
            
            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="8" data-path="chapter8/index.html">
            
                
                    <a href="../chapter8/index.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>8.</b>
                        
                        项目编译
                    </a>
            
            
            <ul class="articles">
                
    
        <li class="chapter " data-level="8.1" data-path="chapter8/8.1_编译原理.html">
            
                
                    <a href="../chapter8/8.1_编译原理.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>8.1.</b>
                        
                        编译原理
                    </a>
            
            
        </li>
    
        <li class="chapter " data-level="8.2" data-path="chapter8/8.2_makefile.html">
            
                
                    <a href="../chapter8/8.2_makefile.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>8.2.</b>
                        
                        makefile
                    </a>
            
            
        </li>
    
        <li class="chapter " data-level="8.3" data-path="chapter8/8.3_cmake.html">
            
                
                    <a href="../chapter8/8.3_cmake.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>8.3.</b>
                        
                        cmake
                    </a>
            
            
        </li>
    
        <li class="chapter " data-level="8.4" data-path="chapter8/8.4_GNU_make.html">
            
                
                    <a href="../chapter8/8.4_GNU_make.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>8.4.</b>
                        
                        GNU make
                    </a>
            
            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="9" data-path="chapter9/index.html">
            
                
                    <a href="../chapter9/index.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>9.</b>
                        
                        调试技巧
                    </a>
            
            
            <ul class="articles">
                
    
        <li class="chapter " data-level="9.1" data-path="chapter9/9.1_gdb调试.html">
            
                
                    <a href="../chapter9/9.1_gdb调试.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>9.1.</b>
                        
                        gdb调试
                    </a>
            
            
        </li>
    
        <li class="chapter " data-level="9.2" data-path="chapter9/9.2_coredump.html">
            
                
                    <a href="../chapter9/9.2_coredump.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>9.2.</b>
                        
                        coredump
                    </a>
            
            
        </li>
    
        <li class="chapter " data-level="9.3" data-path="chapter9/9.3_内存泄漏检查.html">
            
                
                    <a href="../chapter9/9.3_内存泄漏检查.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>9.3.</b>
                        
                        内存泄漏检查
                    </a>
            
            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="10" data-path="chapter10/index.html">
            
                
                    <a href="../chapter10/index.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>10.</b>
                        
                        项目配置文件
                    </a>
            
            
            <ul class="articles">
                
    
        <li class="chapter " data-level="10.1" data-path="chapter10/10.1_ini配置.html">
            
                
                    <a href="../chapter10/10.1_ini配置.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>10.1.</b>
                        
                        ini配置
                    </a>
            
            
        </li>
    
        <li class="chapter " data-level="10.2" data-path="chapter10/10.2_xml配置.html">
            
                
                    <a href="../chapter10/10.2_xml配置.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>10.2.</b>
                        
                        xml配置
                    </a>
            
            
        </li>
    
        <li class="chapter " data-level="10.3" data-path="chapter10/10.3_lua配置.html">
            
                
                    <a href="../chapter10/10.3_lua配置.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>10.3.</b>
                        
                        lua配置
                    </a>
            
            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="11" data-path="chapter11/index.html">
            
                
                    <a href="../chapter11/index.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>11.</b>
                        
                        项目日志
                    </a>
            
            
            <ul class="articles">
                
    
        <li class="chapter " data-level="11.1" data-path="chapter11/11.1_重定向.html">
            
                
                    <a href="../chapter11/11.1_重定向.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>11.1.</b>
                        
                        重定向
                    </a>
            
            
        </li>
    
        <li class="chapter " data-level="11.2" data-path="chapter11/11.2_log4cpp.html">
            
                
                    <a href="../chapter11/11.2_log4cpp.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>11.2.</b>
                        
                        log4cpp
                    </a>
            
            
        </li>
    
        <li class="chapter " data-level="11.3" data-path="chapter11/11.3_大型项目的日志架构.html">
            
                
                    <a href="../chapter11/11.3_大型项目的日志架构.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>11.3.</b>
                        
                        分布式系统的集中式日志解决方案
                    </a>
            
            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="12" data-path="chapter12/index.html">
            
            <span><b>12.</b> 进程</span>
            
            
            <ul class="articles">
                
    
        <li class="chapter " data-level="12.1" data-path="chapter12/12.1_进程的概念.html">
            
                
                    <a href="../chapter12/12.1_进程的概念.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>12.1.</b>
                        
                        进程的概念
                    </a>
            
            
        </li>
    
        <li class="chapter " data-level="12.2" data-path="chapter12/12.2_如何产生一个进程.html">
            
                
                    <a href="../chapter12/12.2_如何产生一个进程.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>12.2.</b>
                        
                        如何产生一个进程
                    </a>
            
            
        </li>
    
        <li class="chapter " data-level="12.3" data-path="chapter12/12.3_僵尸孤儿守护进程.html">
            
                
                    <a href="../chapter12/12.3_僵尸孤儿守护进程.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>12.3.</b>
                        
                        僵尸、孤儿和守护进程
                    </a>
            
            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="13" data-path="chapter13/index.html">
            
            <span><b>13.</b> 进程间通信</span>
            
            
            <ul class="articles">
                
    
        <li class="chapter " data-level="13.1" data-path="chapter13/13.1_管道与命名管道.html">
            
            <span><b>13.1.</b> 管道与命名管道</span>
            
            
        </li>
    
        <li class="chapter " data-level="13.2" data-path="chapter13/13.2_共享内存.html">
            
            <span><b>13.2.</b> 共享内存</span>
            
            
        </li>
    
        <li class="chapter " data-level="13.3" data-path="chapter13/13.3_信号量.html">
            
            <span><b>13.3.</b> 信号量</span>
            
            
        </li>
    
        <li class="chapter " data-level="13.4" data-path="chapter13/13.4_信号.html">
            
            <span><b>13.4.</b> 信号</span>
            
            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="14" data-path="chapter14/index.html">
            
                
                    <a href="../chapter14/index.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>14.</b>
                        
                        网络协议
                    </a>
            
            
            <ul class="articles">
                
    
        <li class="chapter " data-level="14.1" data-path="chapter14/14.1_俗话网络通信.html">
            
                
                    <a href="../chapter14/14.1_俗话网络通信.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>14.1.</b>
                        
                        俗话网络通信
                    </a>
            
            
        </li>
    
        <li class="chapter " data-level="14.2" data-path="chapter14/14.2_网络7层协议与4层协议.html">
            
                
                    <a href="../chapter14/14.2_网络7层协议与4层协议.html">
                
                        <i class="fa fa-check"></i>
                        
                            <b>14.2.</b>
                        
                        网络7层协议与4层协议
                    </a>
            
            
        </li>
    

            </ul>
            
        </li>
    


            
            <li class="divider"></li>
            <li>
                <a href="https://www.gitbook.com" target="blank" class="gitbook-link">
                    Published with GitBook
                </a>
            </li>
            
        </ul>
    </nav>
</div>

    <div class="book-body">
        <div class="body-inner">
            <div class="book-header" role="navigation">
    <!-- Actions Left -->
    

    <!-- Title -->
    <h1>
        <i class="fa fa-circle-o-notch fa-spin"></i>
        <a href="../" >课程介绍</a>
    </h1>
</div>

            <div class="page-wrapper" tabindex="-1" role="main">
                <div class="page-inner">
                
                
                    <section class="normal" id="section-">
                    
                        <h1 id="51-lua&#x8BED;&#x8A00;&#x4ECB;&#x7ECD;">5.1 lua&#x8BED;&#x8A00;&#x4ECB;&#x7ECD;</h1>
<h1 id="part-1">part 1</h1>
<ul>
<li><a href="#1">1.Lua&#x7B80;&#x4ECB;</a></li>
<li><a href="#2">2.&#x51C6;&#x5907;Lua&#x8FD0;&#x884C;&#x73AF;&#x5883;</a></li>
<li><a href="#3">3.&#x57FA;&#x7840;&#x6982;&#x5FF5;</a><ul>
<li><a href="#31">3.1.&#x5E38;&#x91CF;&#x548C;&#x6807;&#x8BC6;&#x7B26;</a></li>
<li><a href="#32">3.2.&#x53D8;&#x91CF;&#x548C;&#x6570;&#x636E;&#x7C7B;&#x578B;</a>  </li>
</ul>
</li>
</ul>
<h1 id="part-2">part 2</h1>
<ul>
<li><a href="#4">4.Lua&#x8C03;&#x7528;C/C++&#x4EE3;&#x7801;</a><ul>
<li><a href="#41">4.1.&#x8FD0;&#x884C;&#x7684;&#x5B9E;&#x4F8B;</a></li>
<li><a href="#42">4.2.&#x5982;&#x4F55;&#x5B9E;&#x73B0;&#x7684;</a></li>
<li><a href="#43">4.3.Luaunit&#x4F7F;&#x7528;</a></li>
</ul>
</li>
<li><a href="#5">5.C/C++&#x4EE3;&#x7801;&#x5982;&#x4F55;&#x8C03;&#x7528;Lua&#x811A;&#x672C;</a></li>
</ul>
<p></p><h3 id="1">1.Lua&#x7B80;&#x4ECB;</h3>
<img src="../images/5.1.0.png" alt="hello"><br>Lua&#x662F;&#x4E00;&#x79CD;&#x53EF;&#x5D4C;&#x5165;&#x3001;&#x8F7B;&#x91CF;&#x3001;&#x5FEB;&#x901F;&#x3001;&#x529F;&#x80FD;&#x5F3A;&#x5927;&#x7684;&#x811A;&#x672C;&#x8BED;&#x8A00;&#x3002;&#x5B83;&#x652F;&#x6301;&#x8FC7;&#x7A0B;&#x5F0F;&#x7F16;&#x7A0B;&#x3001; &#x9762;&#x5411;&#x5BF9;&#x8C61;&#x7F16;&#x7A0B;&#x3001;&#x51FD;&#x6570;&#x5F0F;&#x7F16;&#x7A0B;&#x3001;&#x6570;&#x636E;&#x9A71;&#x52A8;&#x7F16;&#x7A0B;&#x548C;&#x6570;&#x636E;&#x63CF;&#x8FF0;&#xFF08;data description&#xFF09;&#x3002;<p></p>
<p>Lua&#x5C06;&#x7B80;&#x6D01;&#x7684;&#x8FC7;&#x7A0B;&#x5F0F;&#x8BED;&#x6CD5;&#x548C;&#x57FA;&#x4E8E;&#x5173;&#x8054;&#x6570;&#x7EC4;&#x3001;&#x53EF;&#x6269;&#x5C55;&#x8BED;&#x4E49;&#x7684;&#x6570;&#x636E;&#x63CF;&#x8FF0;&#x8BED;&#x6CD5;&#x7ED3;&#x6784;&#x7ED3;&#x5408;&#x4E86;&#x8D77;&#x6765;&#x3002; Lua&#x662F;&#x52A8;&#x6001;&#x7C7B;&#x578B;&#x7684;&#x8BED;&#x8A00;&#xFF0C;&#x5B83;&#x4F7F;&#x7528;&#x57FA;&#x4E8E;&#x5BC4;&#x5B58;&#x5668;&#x7684;&#x865A;&#x62DF;&#x673A;&#x89E3;&#x91CA;&#x548C;&#x8FD0;&#x884C;&#x5B57;&#x8282;&#x7801;&#xFF08;bytecode&#xFF09;&#xFF0C;&#x5E76;&#x4F7F;&#x7528;&#x589E;&#x91CF;&#x5783;&#x7EA7;&#x56DE;&#x6536;&#xFF08;incremental garbage collection&#xFF09;&#x673A;&#x5236;&#x81EA;&#x52A8;&#x7BA1;&#x7406;&#x5185;&#x5B58;&#x3002;&#x8FD9;&#x4E9B;&#x7279;&#x70B9;&#x4F7F;&#x5F97;Lua&#x5F88;&#x9002;&#x5408;&#x7528;&#x4E8E;&#x914D;&#x7F6E;&#x3001;&#x811A;&#x672C;&#x5316;&#x3001;&#x63D2;&#x4EF6;&#x5316;&#x548C;&#x5FEB;&#x901F;&#x6784;&#x9020;&#x539F;&#x578B;&#x7684;&#x573A;&#x666F;&#x3002;</p>
<p>Lua&#x662F;&#x7B2C;&#x4E00;&#x4E2A;&#x7531;&#x7B2C;&#x4E09;&#x4E16;&#x754C;&#x56FD;&#x5BB6;&#xFF08;&#x5DF4;&#x897F;&#xFF09;&#x5F00;&#x53D1;&#x8005;&#x5F00;&#x53D1;&#x7684;&#x6D41;&#x884C;&#x5EA6;&#x5F88;&#x9AD8;&#x7684;&#x8BED;&#x8A00;&#xFF08;and the leading scripting language in games&#xFF09;&#x3002;</p>
<p>Lua&#x89E3;&#x91CA;&#x5668;&#x53EA;&#x6709;2w+&#x591A;&#x884C;ANSI C/C++&#x4EE3;&#x7801;&#xFF0C;&#x53EF;&#x6267;&#x884C;&#x6587;&#x4EF6;200+ KB&#x5927;&#x5C0F;&#x3002;</p>
<p>Lua&#x811A;&#x672C;&#x8BED;&#x8A00;&#xFF0C;&#x8FD0;&#x884C;&#x4F9D;&#x6258;&#x4E8E;&#x5BBF;&#x4E3B;&#x8BED;&#x8A00;&#xFF0C;&#x53EF;&#x4EE5;&#x662F;c++&#xFF0C;c#&#xFF0C;golang&#x7B49;&#xFF0C;&#x53EA;&#x8981;&#x5B9E;&#x73B0;&#x4E86;Lua&#x89E3;&#x91CA;&#x5668;&#x5C31;&#x53EF;&#x4EE5;&#x3002;</p>
<p>Lua&#x4E0D;&#x50CF;python&#xFF0C;&#x6CA1;&#x6709;&#x524D;&#x5411;&#x517C;&#x5BB9;&#x7684;&#x5305;&#x88B1;&#xFF0C;&#x4F46;&#x662F;&#x4E5F;&#x7ED9;&#x5F00;&#x53D1;&#x4EBA;&#x5458;&#x5E26;&#x6765;&#x4E86;&#x4E0D;&#x4FBF;&#x3002;</p>
<p><strong>Lua&#x8BED;&#x8A00;&#x5E94;&#x7528;&#x5728;&#x90A3;&#x4E9B;&#x65B9;&#x9762;&#x7684;&#x5F00;&#x53D1;</strong><br>1.&#x6BD4;&#x5982;&#x6E38;&#x620F;&#x5F15;&#x64CE;&#x9886;&#x57DF;&#x7684;cocos2d-x&#x3001;unity&#xFF0C;&#x7531;&#x4E8E;&#x5F15;&#x64CE;&#x81EA;&#x8EAB;&#x4F7F;&#x7528;&#x7684;c++&#x6216;&#x8005;c#&#x4F5C;&#x4E3A;&#x7F16;&#x5199;&#x8BED;&#x8A00;&#xFF0C;&#x6E38;&#x620F;&#x524D;&#x7AEF;&#x53D1;&#x5E03;&#x540E;&#xFF0C;&#x53D1;&#x73B0;bug&#x6216;&#x8005;&#x53D1;&#x5E03;&#x65B0;&#x903B;&#x8F91;&#xFF0C;&#x90FD;&#x9700;&#x8981;&#x91CD;&#x65B0;&#x51FA;&#x5305;&#xFF0C;&#x5468;&#x671F;&#x8FC7;&#x957F;&#xFF0C;lua&#x4F5C;&#x4E3A;&#x811A;&#x672C;&#x8BED;&#x8A00;&#xFF0C;&#x53EF;&#x4EE5;&#x4EE5;&#x8D44;&#x6E90;&#x7684;&#x5F62;&#x5F0F;&#x4E0B;&#x8F7D;&#xFF0C;&#x91CD;&#x65B0;&#x52A0;&#x8F7D;&#x8FD0;&#x884C;&#xFF0C;&#x5468;&#x671F;&#x5FEB;&#xFF0C;&#x4E14;&#x6548;&#x7387;&#x635F;&#x5931;&#x6709;&#x9650;&#xFF1B;<br>2.&#x670D;&#x52A1;&#x7AEF;&#x4F7F;&#x7528;&#xFF0C;&#x6BD4;&#x8F83;&#x706B;&#x7684;&#x4E5F;&#x5C31;&#x662F;nginx+lua&#x7684;&#x5F62;&#x5F0F;&#xFF0C;&#x540E;&#x6765;&#x6709;&#x4EBA;&#x505A;&#x4E86;&#x6846;&#x67B6;openresty&#xFF0C;&#x57FA;&#x672C;&#x4E5F;&#x662F;&#x5229;&#x7528;nginx&#x7684;&#x9AD8;&#x6027;&#x80FD;+lua&#x811A;&#x672C;&#x7684;&#x7075;&#x6D3B;&#x6027;&#xFF0C;&#x903B;&#x8F91;&#x4FEE;&#x6539;&#x4E4B;&#x540E;&#x53EA;&#x9700;&#x8981;&#x89E6;&#x53D1;&#x91CD;&#x65B0;&#x52A0;&#x8F7D;&#x811A;&#x672C;&#x5C31;&#x53EF;&#x4EE5;&#xFF0C;&#x5F00;&#x53D1;&#x8FD0;&#x884C;&#x6548;&#x7387;&#x90FD;&#x6BD4;&#x8F83;&#x9AD8;&#xFF0C;&#x76F8;&#x6BD4;&#x4F20;&#x7EDF;c++&#x3001;java&#x7B49;&#x9700;&#x8981;&#x91CD;&#x65B0;&#x7F16;&#x8BD1;&#x90E8;&#x7F72;&#xFF0C;&#x5F00;&#x53D1;&#x6548;&#x7387;&#x9AD8;&#x5F88;&#x591A;&#x3002;</p>
<p><strong>&#x90A3;&#x4E9B;&#x77E5;&#x540D;&#x9879;&#x76EE;&#x5E94;&#x7528;&#x4E86;Lua&#x8BED;&#x8A00;</strong></p>
<ul>
<li>openresty (nginx&#x7684;lua&#x6A21;&#x5757;)</li>
<li>redis&#x652F;&#x6301;&#x670D;&#x52A1;&#x7AEF;lua&#x811A;&#x672C;</li>
<li>PostgreSQL&#x652F;&#x6301;&#x670D;&#x52A1;&#x7AEF;Lua&#x811A;&#x672C;</li>
<li>LuaTeX&#xFF0C;&#x57FA;&#x4E8E;TeX&#x7684;&#x6392;&#x7248;&#x5F15;&#x64CE;</li>
<li>&#x8FC5;&#x96F7;&#x4E5F;&#x5728;&#x7528;</li>
<li>&#x6E38;&#x620F;&#x5F00;&#x53D1;&#xFF1A;&#x4E91;&#x98CE;&#x7684;skynet</li>
<li>MediaWiki&#xFF08;&#x7EF4;&#x57FA;&#x767E;&#x79D1;&#x6240;&#x4F7F;&#x7528;&#x7684;&#x8F6F;&#x4EF6;&#xFF09;&#x5927;&#x91CF;&#x4F7F;&#x7528;Lua&#x7F16;&#x5199;&#x7684;&#x6A21;&#x5757;&#xFF0C;&#x7528;&#x4E8E;&#x751F;&#x6210;&#x7279;&#x5B9A;&#x7684;&#x9875;&#x9762;&#x5185;&#x5BB9;</li>
<li>Vim&#x3001;WeChat&#x3001;Wireshark&#x4E5F;&#x652F;&#x6301;Lua&#x811A;&#x672C;&#x7F16;&#x5199;&#x63D2;&#x4EF6;</li>
<li>openwrt&#x7684;&#x8DEF;&#x7531;&#x5668;&#x4E5F;&#x662F;&#x7528;lua&#x5F00;&#x53D1;&#x7684;&#x914D;&#x7F6E;&#x8DEF;&#x7531;&#x5668;&#x7684;UI</li>
</ul>
<p>Lua&#x5B98;&#x65B9;&#x4E8E;2011&#x5E74;&#x53D1;&#x5E03;&#x7684;5.2&#x548C;2015&#x5E74;&#x53D1;&#x5E03;&#x4E86;5.3&#x7248;&#x672C;&#xFF0C;&#x548C;&#x7528;&#x6237;&#x89C4;&#x6A21;&#x5F88;&#x5927;&#x7684;2006&#x5E74;&#x53D1;&#x5E03;&#x7684;5.1&#x76F8;&#x6BD4;&#xFF0C;&#x6539;&#x52A8;&#x5F88;&#x5927;&#xFF0C;&#x5728;Lua&#x8BED;&#x6CD5;&#x548C;C API&#x65B9;&#x9762;&#x90FD;&#x4E92;&#x4E0D;&#x517C;&#x5BB9;&#x3002;&#x4EE5;&#x4E0B;&#x6240;&#x6709;&#x7684;&#x6559;&#x7A0B;&#x8BF4;&#x660E;&#x90FD;&#x662F;&#x57FA;&#x4E8E;5.2&#x7248;&#x672C;&#x7684;&#x3002;</p>
<p></p><h3 id="2">2.&#x51C6;&#x5907;Lua&#x8FD0;&#x884C;&#x73AF;&#x5883;</h3>
&#x5728;Linux&#x7CFB;&#x7EDF;&#x5B89;&#x88C5;Lua&#xFF0C;&#x4F7F;&#x7528;&#x4E0B;&#x9762;&#x7684;&#x547D;&#x4EE4;&#x4E0B;&#x8F7D;&#x5E76;&#x751F;&#x6210;Lua&#x7A0B;&#x5E8F;&#xFF1A;<p></p>
<pre><code>$ wget http://www.lua.org/ftp/lua-5.2.3.tar.gz
$ tar zxf lua-5.2.3.tar.gz
$ cd lua-5.2.3
$ make linux test
</code></pre><p>&#x5728;&#x5176;&#x5B83;&#x7CFB;&#x7EDF;&#x4E0A;&#x5B89;&#x88C5;Lua&#x65F6;&#xFF0C;&#x6BD4;&#x5982;aix&#xFF0C;ansi&#xFF0C;bsd&#xFF0C;generic&#xFF0C;linux&#xFF0C;mingw&#xFF0C;posix&#xFF0C;solaris&#xFF0C;&#x4F60;&#x9700;&#x8981;&#x5C06;make linux test&#x547D;&#x4EE4;&#x4E2D;&#x7684;linux&#x66FF;&#x6362;&#x4E3A;&#x76F8;&#x5E94;&#x7684;&#x7CFB;&#x7EDF;&#x5E73;&#x53F0;&#x540D;&#x79F0;&#x3002;</p>
<p>&#x5047;&#x8BBE;&#x6211;&#x4EEC;&#x5DF2;&#x7ECF;&#x6709;&#x4E00;&#x4E2A;&#x6587;&#x4EF6; helloWord.lua &#xFF0C;&#x6587;&#x4EF6;&#x5185;&#x5BB9;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code>print(&quot;Hello World!&quot;)
</code></pre><p>&#x6211;&#x4EEC;&#x5148;&#x4F7F;&#x7528;cd&#x547D;&#x4EE4;&#x5207;&#x6362;&#x81F3; helloWord.lua&#x6587;&#x4EF6;&#x6240;&#x5728;&#x7684;&#x76EE;&#x5F55;&#xFF0C;&#x7136;&#x540E;&#x751F;&#x6210;&#x5E76;&#x8FD0;&#x884C;&#x8BE5;&#x6587;&#x4EF6;&#xFF1A;&#x3000;&#x3000;</p>
<pre><code>$ lua helloWorld
</code></pre><p>&#x6267;&#x884C;&#x4E0A;&#x9762;&#x7684;&#x547D;&#x4EE4;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x5982;&#x4E0B;&#x7684;&#x8F93;&#x51FA;&#xFF1A;</p>
<pre><code>hello world
</code></pre><p></p><h3 id="3">3.&#x57FA;&#x7840;&#x6982;&#x5FF5;</h3><p></p>
<p></p><h4 id="3.1">3.1.&#x5E38;&#x91CF;&#x548C;&#x6807;&#x8BC6;&#x7B26;</h4><p></p>
<ul>
<li><p>&#x8BED;&#x8A00;&#x5173;&#x952E;&#x5B57;</p>
<pre><code>and, break, do, else, elseif, end, false, for, function, if, in,
local, nil, not, or, repeat, return, then, true, until, while
</code></pre></li>
<li><p>&#x5176;&#x5B83;&#x6807;&#x8BC6;&#x7B26;   </p>
</li>
</ul>
<pre><code>\+ \- \* / % ^ # == ~= &lt;= &gt;= &lt; &gt; = ( ) { } [ ] ; : , . .. ...
</code></pre><ul>
<li>&#x5E38;&#x91CF;&#x5B57;&#x7B26;&#x4E32;&#x4F7F;&#x7528; &apos; &#x6216; &quot; &#x5206;&#x9694;&#xFF0C;&#x5176;&#x4E2D;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x7C7B;&#x4F3C; C &#x8BED;&#x8A00;&#x7684;&#x8F6C;&#x4E49;&#x5B57;&#x7B26;&#x5E8F;&#x5217;&#xFF1A;  </li>
</ul>
<pre><code>\a, \b, \f, \n, \r, \t, \v, \\, \&quot;, \ddd, \0
</code></pre><ul>
<li>&#x4F5C;&#x4E3A;&#x60EF;&#x4F8B;&#xFF0C;Lua &#x628A;&#x4EE5; _ &#x5B57;&#x7B26;&#x5F00;&#x59CB;&#x5168;&#x90E8;&#x4F7F;&#x7528;&#x5927;&#x5199;&#x5B57;&#x6BCD;&#x7684;&#x53D8;&#x91CF;&#x540D;&#xFF0C;&#x4FDD;&#x7559;&#x4E3A;&#x5185;&#x90E8;&#x5168;&#x5C40;&#x53D8;&#x91CF;&#xFF1B;  </li>
</ul>
<pre><code>_VERSION
</code></pre><ul>
<li>Lua&#x4F7F;&#x7528;&#x53CC;&#x7CBE;&#x5EA6;&#x6D6E;&#x70B9;&#x6570;&#x8868;&#x793A;&#x6570;&#x5B57;&#x5E38;&#x91CF;&#xFF0C;&#x6570;&#x636E;&#x5E38;&#x91CF;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x5341;&#x516D;&#x8FDB;&#x5236;&#x6216;&#x79D1;&#x5B66;&#x8BA1;&#x6570;&#x6CD5;&#xFF1A;  </li>
</ul>
<pre><code>3, 3.0, 3.1416, 314.16e-2, 0xff, 0x56
</code></pre><ul>
<li>Lua&#x6CE8;&#x91CA;&#x6709;&#x77ED;&#x6CE8;&#x91CA;&#x548C;&#x957F;&#x6CE8;&#x91CA;&#x4E24;&#x79CD;&#x6CE8;&#x91CA;&#x65B9;&#x5F0F;&#xFF1A;  </li>
</ul>
<pre><code>-- short comment

--[[
     this is a very loooooooooooooong
     comment
]]
</code></pre><p></p><h4 id="31">3.1.&#x53D8;&#x91CF;&#x548C;&#x6570;&#x636E;&#x7C7B;&#x578B;</h4><p></p>
<ul>
<li><p>Lua&#x662F;&#x4E00;&#x4E2A;&#x52A8;&#x6001;&#x7C7B;&#x578B;&#x8BED;&#x8A00;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#xFF1A;</p>
<ul>
<li>&#x53D8;&#x91CF;&#x6CA1;&#x6709;&#x7C7B;&#x578B;&#x4FE1;&#x606F;&#xFF0C;&#x4F46;&#x662F;&#x503C;&#x6709;&#x7C7B;&#x578B;&#x4FE1;&#x606F;&#xFF1B;  </li>
<li>&#x4EE3;&#x7801;&#x4E2D;&#x6CA1;&#x6709;&#x7C7B;&#x578B;&#x5B9A;&#x4E49;&#x8BED;&#x53E5;&#xFF0C;&#x7C7B;&#x578B;&#x4FE1;&#x606F;&#x7531;&#x503C;&#x643A;&#x5E26;&#xFF1B;</li>
<li>&#x6240;&#x6709;&#x7684;&#x503C;&#x90FD;&#x662F;first-class&#xFF08;&#x57FA;&#x672C;&#x7C7B;&#x578B;&#xFF09;&#x7684;&#xFF0C;&#x5B83;&#x4EEC;&#x53EF;&#x4EE5;&#x5B58;&#x50A8;&#x5728;&#x53D8;&#x91CF;&#x4E2D;&#x3001;&#x4F5C;&#x4E3A;&#x53C2;&#x6570;&#x4F20;&#x9012;&#x7ED9;&#x5176;&#x5B83;&#x51FD;&#x6570;&#x6216;&#x8005;&#x4F5C;&#x4E3A;&#x51FD;&#x6570;&#x7684;&#x8FD4;&#x56DE;&#x503C;&#x3002;</li>
</ul>
</li>
<li><p>Lua&#x63D0;&#x4F9B;&#x4E86;8&#x79CD;&#x57FA;&#x7840;&#x7C7B;&#x578B;&#xFF1A;</p>
<ul>
<li><p>nil - &#x6B64;&#x7C7B;&#x578B;&#x4E0B;&#x5B9A;&#x4E49;&#x7684;&#x503C;&#x53EA;&#x6709;nil&#xFF0C;&#x5B83;&#x7684;&#x4E3B;&#x8981;&#x5C5E;&#x6027;&#x5C31;&#x662F;&#xFF1A;&#x548C;&#x5176;&#x5B83;&#x503C;&#x4E0D;&#x4E00;&#x6837;&#x3002;&#x901A;&#x5E38;&#xFF0C;nil&#x7528;&#x5728;&#x5176;&#x5B83;&#x6709;&#x610F;&#x4E49;&#x7684;&#x503C;&#x7F3A;&#x5931;&#x7684;&#x573A;&#x666F;&#xFF0C;&#x6709;&#x70B9;&#x513F;&#x50CF;C++&#x8BED;&#x8A00;&#x7684;&#x7A7A;&#x5F15;&#x7528;&#x7684;&#x610F;&#x601D;&#xFF0C;&#x6211;&#x4EEC;&#x77E5;&#x9053;C++&#x6CA1;&#x6709;&#x529E;&#x6CD5;&#x8868;&#x793A;&#x7A7A;&#x5F15;&#x7528;&#xFF0C;&#x4F46;&#x662F;Lua&#x7528;nil&#x8868;&#x793A;&#x3002;</p>
</li>
<li><p>boolean - &#x6B64;&#x7C7B;&#x578B;&#x4E0B;&#x5B9A;&#x4E49;&#x7684;&#x503C;&#x6709;false&#x548C;true &#x3002; &#x5728;Lua&#x7684;&#x6761;&#x4EF6;&#x8868;&#x8FBE;&#x5F0F;&#x91CC;&#xFF0C; &#x9664;&#x4E86;nil&#x548C;false&#x4E3A;&#x201D;&#x5047;&#x503C;&#x201C;&#x5916;&#xFF0C;&#x5176;&#x5B83;&#x7C7B;&#x578B;&#x90FD;&#x662F;&#x201D;&#x771F;&#x503C;&#x201C;&#xFF08;&#x6BD4;&#x5982;&#xFF0C; 0 &#x548C; &apos;&apos; &#x5728;Lua&#x4E2D;&#x90FD;&#x662F;&#x201D;&#x771F;&#x201C;&#x503C;&#xFF09;&#x3002;</p>
</li>
<li><p>number - Lua&#x9ED8;&#x8BA4;&#x4F7F;&#x7528;&#x53CC;&#x7CBE;&#x5EA6;&#x6D6E;&#x70B9;&#x578B;&#x5B58;&#x50A8;&#x8BE5;&#x7C7B;&#x578B;&#x7684;&#x503C;&#x3002;</p>
</li>
<li><p>string - &#x6B64;&#x7C7B;&#x578B;&#x7684;&#x503C;&#x53EF;&#x4EE5;&#x7531;&#x4EFB;&#x4F55;8-bit&#x5B57;&#x7B26;&#x7EC4;&#x6210;&#x3002;Lua&#x5728;&#x5185;&#x5B58;&#x4E2D;&#x4E3A;&#x76F8;&#x540C;&#x7684;&#x5B57;&#x7B26;&#x4E32;&#x4FDD;&#x7559;&#x4E00;&#x4EFD;&#x6570;&#x636E;&#xFF0C;&#x540C;&#x65F6;&#xFF0C;Lua&#x4E0D;&#x5141;&#x8BB8;&#x5BF9;&#x5B57;&#x7B26;&#x4E32;&#x5E38;&#x91CF;&#x8FDB;&#x884C;&#x4FEE;&#x6539;&#x3002;</p>
</li>
<li><p>function - &#x6B64;&#x7C7B;&#x578B;&#x7684;&#x503C;&#x662F;&#x4F7F;&#x7528;Lua&#x6216;&#x8005;C&#x7F16;&#x5199;&#x7684;&#x51FD;&#x6570;&#x3002;</p>
</li>
<li><p>userdata - &#x6B64;&#x7C7B;&#x578B;&#x7684;&#x503C;&#x662F;C&#x8BED;&#x8A00;&#x6570;&#x636E;&#xFF0C;&#x4ECE;Lua&#x7684;&#x89D2;&#x5EA6;&#x770B;&#xFF0C;&#x8FD9;&#x4E9B;&#x503C;&#x5BF9;&#x5E94;&#x4E00;&#x5757;&#x65E0;&#x9884;&#x5B9A;&#x4E49;&#x884C;&#x4E3A;&#x7684;&#x88F8;&#x5185;&#x5B58;&#x3002;Lua&#x4E0D;&#x5141;&#x8BB8;&#x4F7F;&#x7528;Lua&#x4EE3;&#x7801;&#x521B;&#x5EFA;&#x6216;&#x8005;&#x4FEE;&#x6539;userdata &#xFF0C;&#x4F46;&#x662F;&#x5141;&#x8BB8;&#x4F7F;&#x7528; C API &#x5B9E;&#x73B0;&#x8FD9;&#x6837;&#x7684;&#x529F;&#x80FD;&#x3002;&#x53E6;&#x5916;&#xFF0C;&#x7528;&#x6237;&#x53EF;&#x4EE5;&#x4E3A;userdata&#x8BBE;&#x5B9A;metatable &#xFF0C;&#x5B9A;&#x4E49;&#x66F4;&#x591A;&#x53EF;&#x4EE5;&#x5728;&#x5B83;&#x4E0A;&#x9762;&#x6267;&#x884C;&#x7684;&#x64CD;&#x4F5C;&#xFF0C;&#x7531;&#x6B64;&#x53EF;&#x89C1;userdata&#x7528;&#x4E8E;C&#x8BED;&#x8A00;&#x5199;&#x7684;&#x7A0B;&#x5E8F;&#x548C;Lua&#x7A0B;&#x5E8F;&#x4EA4;&#x6362;&#x6570;&#x636E;&#x3002;</p>
</li>
<li><p>thread - &#x6B64;&#x7C7B;&#x578B;&#x7684;&#x503C;&#x662F;Lua&#x7EBF;&#x7A0B;&#xFF0C;Lua&#x901A;&#x8FC7;&#x5B83;&#x5B9E;&#x73B0;&#x534F;&#x7A0B;&#x529F;&#x80FD;&#x3002;</p>
</li>
<li><p>table - &#x6B64;&#x7C7B;&#x578B;&#x7684;&#x503C;&#x662F;&#x5173;&#x8054;&#x6570;&#x7EC4;&#xFF08;associative array&#xFF09;&#xFF0C;&#x8BE5;&#x7C7B;&#x578B;&#x6709;&#x6570;&#x7EC4;&#x90E8;&#x5206;&#x548C;&#x5B57;&#x5178;&#x90E8;&#x5206;&#x7EC4;&#x6210;&#x3002;&#x6570;&#x7EC4;&#x90E8;&#x5206;&#x4FDD;&#x5B58;&#x7D22;&#x5F15;&#x4E3A;&#x6574;&#x6570;&#xFF0C;&#x5E76;&#x4E14;&#x4ECE;1&#x5F00;&#x59CB;&#x8FDE;&#x7EED;&#x7684;&#x6570;&#x636E;&#xFF1B;&#x5B57;&#x5178;&#x90E8;&#x5206;&#x4FDD;&#x5B58;&#x5269;&#x4F59;&#x5176;&#x5B83;&#x6570;&#x636E;&#xFF08;&#x5305;&#x62EC;&#x7D22;&#x5F15;&#x662F;&#x6574;&#x6570;&#xFF0C;&#x4F46;&#x662F;&#x4E0D;&#x5728; [1, #table] &#x7684;&#x6570;&#x636E;&#xFF09;&#xFF0C;table&#x662F;Lua&#x4E2D;&#x6700;&#x91CD;&#x8981;&#x7684;&#x6570;&#x636E;&#x7C7B;&#x578B;&#x4E86;&#x3002;</p>
</li>
<li><p>table, function, thread &#x548C; userdata &#x7C7B;&#x578B;&#x7684;&#x503C;&#x5728;&#x8D4B;&#x503C;&#x3001;&#x53C2;&#x6570; &#x4F20;&#x9012;&#x3001;&#x51FD;&#x6570;&#x8FD4;&#x56DE;&#x503C;&#x7B49;&#x64CD;&#x4F5C;&#x4E2D;&#xFF0C;&#x4F7F;&#x7528;&#x5BF9;&#x5B83;&#x4EEC;&#x5F15;&#x7528;&#xFF0C;&#x800C;&#x975E;&#x62F7;&#x8D1D;&#xFF1B;</p>
</li>
<li><p>&#x53EF;&#x4EE5;&#x4F7F;&#x7528;type()&#x51FD;&#x6570;&#x5F97;&#x5230;&#x63CF;&#x8FF0;&#x503C;&#x7C7B;&#x578B;&#x7684;&#x5B57;&#x7B26;&#x4E32;&#xFF1B;</p>
</li>
<li><p>&#x5728;&#x8FD0;&#x884C;&#x65F6;&#xFF0C;Lua&#x4F1A;&#x81EA;&#x52A8;&#x6839;&#x636E;&#x4E0A;&#x4E0B;&#x6587;&#x5BF9;string&#x548C;number&#x7C7B;&#x578B;&#x503C;&#x4E92;&#x76F8;&#x8F6C;&#x6362;&#x7C7B;&#x578B;&#xFF08;&#x4F5C;&#x4E3A;&#x5F3A;&#x7C7B;&#x578B;&#x8BED;&#x8A00;&#xFF0C;Lua&#x53EA;&#x652F;&#x6301;&#x5982;&#x4E0B;&#x9690;&#x5F0F;&#x8F6C;&#x6362;&#xFF09;&#xFF1A;  </p>
<ul>
<li>&#x5728;&#x7B97;&#x672F;&#x8FD0;&#x7B97;&#x4E2D;&#xFF0C;&#x5C06;string&#x7C7B;&#x578B;&#x8F6C;&#x6362;&#x4E3A;number&#x7C7B;&#x578B;&#xFF1B;    <pre><code>10 + &quot;10&quot;
</code></pre></li>
<li>&#x5F53;number&#x7C7B;&#x578B;&#x7528;&#x4E8E;&#x9700;&#x8981;string&#x7C7B;&#x578B;&#x53C2;&#x4E0E;&#x7684;&#x573A;&#x5408;&#x65F6;&#xFF0C;&#x5C06;number&#x7C7B;&#x578B;&#x8F6C;&#x6362;&#x4E3A;string &#xFF1B;    </li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>-- valid
10 .. &quot; boxes&quot;

-- invalid
10 == &quot;10&quot;
</code></pre><p>&#x66F4;&#x591A;&#x521D;&#x7EA7;&#x5185;&#x5BB9;&#xFF0C;&#x8BF7;&#x79FB;&#x6B65;&#x81F3;: <a href="http://www.runoob.com/lua/lua-tutorial.html" target="_blank">lua&#x5165;&#x95E8;</a></p>
<p></p><h3 id="4">4.Lua&#x8C03;&#x7528;C/C++&#x4EE3;&#x7801;</h3> 
Lua&#x662F;&#x4E00;&#x95E8;&#x52A8;&#x6001;&#x811A;&#x672C;&#x8BED;&#x8A00;&#xFF0C;&#x8FD0;&#x884C;&#x4F9D;&#x6258;&#x4E8E;&#x5BBF;&#x4E3B;&#x8BED;&#x8A00;&#xFF0C;&#x53EF;&#x4EE5;&#x662F;c&#xFF0C;c++&#xFF0C;c#&#xFF0C;golang&#x7B49;&#xFF0C;&#x53EA;&#x8981;&#x5B9E;&#x73B0;&#x4E86;Lua&#x89E3;&#x91CA;&#x5668;&#x5C31;&#x53EF;&#x4EE5;&#x3002;&#x6240;&#x4EE5;&#xFF0C;Lua&#x4ECE;&#x8BBE;&#x8BA1;&#x6765;&#x8BB2;&#x5C31;&#x662F;&#x52A8;&#x6001;&#x811A;&#x672C;&#x8BED;&#x8A00;&#xFF0C;&#x6B63;&#x662F;&#x56E0;&#x4E3A;&#x662F;&#x89E3;&#x91CA;&#x6027;&#x8BED;&#x8A00;&#xFF0C;&#x6240;&#x4EE5;&#x5B83;&#x66F4;&#x5145;&#x5F53;&#x4E86;&#x8FD9;&#x4E9B;&#x5BBF;&#x4E3B;&#x8BED;&#x8A00;&#x7684;&#x201C;&#x7F1D;&#x5408;&#x201D;&#x4F5C;&#x7528;&#xFF0C;&#x662F;&#x4E3A;&#x201C;&#x80F6;&#x6C34;&#x201D;&#x6027;&#x8BED;&#x8A00;&#x3002;&#x90A3;&#x4E48;&#x6211;&#x4EEC;&#x9996;&#x5148;&#x6765;&#x770B;&#x4E00;&#x4E2A;&#x793A;&#x4F8B;&#xFF0C;&#x5B83;&#x662F;&#x5982;&#x4F55;&#x8C03;&#x7528;C/C++&#x8BED;&#x8A00;&#x7684;&#x5462;&#xFF1F;&#x4E0B;&#x6587;&#x6211;&#x4EEC;&#x5148;&#x770B;&#x4E00;&#x4E2A;&#x4F8B;&#x5B50;&#x3002;<p></p>
<p></p><h3 id="41">4.1.&#x8FD0;&#x884C;&#x7684;&#x5B9E;&#x4F8B;</h3>
&#x54E6;&#xFF0C;&#x66FE;&#x7ECF;Lee&#x54E5;&#x7528;Lua&#x5199;&#x6D4B;&#x8BD5;&#x7528;&#x4F8B;&#xFF0C;&#x65E2;&#x7136;&#x8BF4;&#x5230;&#x6D4B;&#x8BD5;&#xFF0C;&#x90A3;&#x5C31;&#x8981;&#x5B9E;&#x73B0;&#x5BF9;&#x4E00;&#x4E9B;&#x5916;&#x90E8;&#x8BBE;&#x5907;&#x8FDB;&#x884C;&#x6A21;&#x62DF;&#xFF0C;&#x8FD8;&#x8981;&#x5B9E;&#x73B0;&#x4E0E;&#x540E;&#x53F0;&#x670D;&#x52A1;&#x6A21;&#x5757;&#x7684;&#x901A;&#x8BAF;&#xFF0C;&#x8FD9;&#x4E9B;&#x5B9E;&#x73B0;&#x7528;C/C++&#x8BED;&#x8A00;&#x5B9E;&#x73B0;&#x6BD4;&#x8F83;&#x597D;&#xFF0C;&#x90A3;&#x6574;&#x4E2A;&#x6574;&#x4F53;&#x662F;&#x600E;&#x4E48;&#x6837;&#x7684;&#x5462;&#xFF1F;&#x5148;&#x770B;&#x4EE3;&#x7801; :<p></p>
<pre><code>_path = &apos;;../src/?.lua;&apos;
extern_path = &apos;;../src/test/?.so;../../third/lib/thrift/?.so;&apos;
package.path = lua_path .. package.path
package.cpath = extern_path .. package.cpath

local proxy = require(&quot;libbcs_proxy&quot;)

--local g_ns_ip = &quot;113.240.243.236&quot;
local g_ns_ip = &quot;192.168.107.117&quot;;
local g_ns_cluster_proxy_ip = &quot;192.168.107.117&quot;;
local g_ns_port = 9000;
local g_dev_port = 9001;
local g_ns_log_conf_path = &quot;../conf/log.conf&quot;;

local lu = require(&apos;luaunit&apos;)
EXPORT_ASSERT_TO_GLOBALS = true

-- sleep n milliseconds
function sleep(n)
   os.execute(&quot;usleep &quot; .. n*1000)
end

TestSetVolume = {}

    function TestSetVolume:test_set_volume_with_exist_device_tc()
        lu.assertEquals(proxy.init(g_ns_ip, g_ns_port, g_ns_log_conf_path), 0);
        lu.assertEquals(proxy.create_dev(2001, g_ns_cluster_proxy_ip, g_dev_port), 0);
        sleep(1000);
        lu.assertEquals(proxy.load(&quot;03.set_volume_tc/setVolume_request.json&quot;, &quot;03.set_volume_tc/setVolume_response.json&quot;), 0);
        lu.assertEquals(proxy.run(), 0);

        sleep(500);

        lu.assertEquals(proxy.check_dev_recvd(2001, &quot;03.set_volume_tc/dev_2001_setvolume.json&quot;), 0);

        sleep(500);
        proxy.uninstall();
    end

    function TestSetVolume:test_set_volume_less_than_0_tc()
        lu.assertEquals(proxy.init(g_ns_ip, g_ns_port, g_ns_log_conf_path), 0);
        lu.assertEquals(proxy.create_dev(2002, g_ns_cluster_proxy_ip, g_dev_port), 0);
        sleep(1000);
        lu.assertEquals(proxy.load(&quot;17.set_volume_less_than_0_tc/setVolume_request.json&quot;, &quot;17.set_volume_less_than_0_tc/setVolume_response.json&quot;), 0);
        lu.assertEquals(proxy.run(), 0);

        sleep(500);
        proxy.uninstall();
    end

    function TestSetVolume:test_set_volume_big_than_100_tc()
        lu.assertEquals(proxy.init(g_ns_ip, g_ns_port, g_ns_log_conf_path), 0);
        lu.assertEquals(proxy.create_dev(2003, g_ns_cluster_proxy_ip, g_dev_port), 0);
        sleep(1000);
        lu.assertEquals(proxy.load(&quot;18.set_volume_big_than_100_tc/setVolume_request.json&quot;, &quot;18.set_volume_big_than_100_tc/setVolume_response.json&quot;), 0);
        lu.assertEquals(proxy.run(), 0);

        sleep(500);
        proxy.uninstall();
    end

    function TestSetVolume:test_set_volume_with_no_exist_dev_tc()
        lu.assertEquals(proxy.init(g_ns_ip, g_ns_port, g_ns_log_conf_path), 0);
        lu.assertEquals(proxy.load(&quot;19.set_volume_with_no_exist_dev_tc/setVolume_request.json&quot;, &quot;19.set_volume_with_no_exist_dev_tc/setVolume_response.json&quot;), 0);
        lu.assertEquals(proxy.run(), 0);

        sleep(500);
        proxy.uninstall();
    end

lu.TABLE_EQUALS_KEYBYCONTENT = true
-- run your tests:
os.exit( lu.LuaUnit.run() )
</code></pre><p>&#x4ECE;&#x4E0A;&#x6587;&#x4EE3;&#x7801;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x6E05;&#x695A;&#x770B;&#x5230;&#xFF0C;&#x6211;&#x4EEC;&#x52A0;&#x8F7D;&#x4E86;libbcs_proxy.so&#xFF08;local proxy = require(&quot;libbcs_proxy&quot;)&#xFF09;&#x5E93;&#xFF0C;&#x8FD9;&#x4E2A;&#x5E93;&#x5C31;&#x662F;&#x6211;&#x4EEC;&#x4F7F;&#x7528;c/c++&#x5C01;&#x88C5;&#x7684;&#x52A8;&#x6001;&#x5E93;&#xFF0C;&#x90A3;&#x8FD9;&#x4E2A;&#x52A8;&#x6001;&#x5E93;&#x63D0;&#x4F9B;&#x54EA;&#x4E9B;&#x529F;&#x80FD;&#x5462;&#xFF1F;&#x6211;&#x4EEC;&#x6765;&#x770B;&#x4E00;&#x4E2A;&#x6D4B;&#x8BD5;&#x7528;&#x4F8B;&#xFF1A;  </p>
<pre><code>TestNSProxysvrResendFunction = {}

    function TestNSProxysvrResendFunction:test_nsproxysvr_resend_tc()
        lu.assertEquals(proxy.init(g_ns_ip, g_ns_port, g_ns_log_conf_path), 0);
        lu.assertEquals(proxy.create_dev(2222, g_ns_cluster_proxy_ip, g_dev_port), 0);
        lu.assertEquals(proxy.disable_dev_send_response(2222), 0);
        sleep(4000);
        lu.assertEquals(proxy.load(&quot;31.nsproxysvr_resend_function_tc/request.json&quot;, &quot;31.nsproxysvr_resend_function_tc/response.json&quot;), 0);
        lu.assertEquals(proxy.run(), 0);

        sleep(500*10);
        proxy.uninstall();
    end
</code></pre><p>TestNSProxysvrResendFunction&#x662F;lua&#x8BED;&#x8A00;&#x4E2D;&#x7684;&#x4E00;&#x4E2A;table&#xFF0C;lua&#x4E2D;&#x7684;table&#x5F88;&#x795E;&#x5947;&#x56E0;&#x4E3A;lua&#x53EA;&#x6709;table&#x4E00;&#x79CD;&#x6570;&#x636E;&#x7ED3;&#x6784;&#xFF0C;&#x7B80;&#x5355;&#x5230;&#x5413;&#x6B7B;&#x4EBA;&#x3002;&#x63A5;&#x7740;&#x5728;TestNSProxysvrResendFunction&#x4E2D;&#x5B9A;&#x4E49;&#x4E86;&#x4E00;&#x4E2A;test_nsproxysvr_resend_tc&#x7684;&#x6D4B;&#x8BD5;&#x51FD;&#x6570;&#xFF0C;&#x8BE5;&#x51FD;&#x6570;&#x9996;&#x5148;&#x8C03;&#x7528;proxy.init&#x521D;&#x59CB;&#x5316;&#x4E86;proxy&#x6A21;&#x5757;(&#x7528;C/C++&#x5B9E;&#x73B0;&#x7684;)&#xFF0C;&#x7136;&#x540E;&#x521B;&#x5EFA;&#x865A;&#x62DF;&#x8BBE;&#x5907;&#xFF0C;&#x5B8C;&#x4E86;&#x4E4B;&#x540E;&#xFF0C;&#x8C03;&#x7528;load&#x51FD;&#x6570;&#x52A0;&#x8F7D;&#x6D4B;&#x8BD5;&#x7528;&#x4F8B;&#x6240;&#x9700;&#x8981;&#x7684;&#x6D88;&#x606F;&#x5B9A;&#x4E49;&#x7684;&#x6587;&#x4EF6;&#xFF08;&#x8FD9;&#x4E9B;&#x6587;&#x4EF6;&#x662F;&#x7528;json&#x683C;&#x5F0F;&#x5199;&#x7684;&#xFF09;&#xFF0C;
&#x5185;&#x5BB9;&#x5982;&#x4E0B;&#xFF1A;  </p>
<pre><code>// request&#x6587;&#x4EF6;
{
    &quot;cmd&quot;: &quot;realPlay&quot;,
    &quot;cmdType&quot;: 0,
    &quot;data&quot;: {
        &quot;sessionId&quot;: &quot;a42178dbee4147a8a7e42cc6bdc668e0&quot;,
        &quot;playURL&quot;: &quot;rtsp://113.240.243.246/session2.sdp&quot;,
        &quot;devList&quot;: [{
            &quot;devNo&quot;: 2222,
            &quot;priority&quot;: 100
        }]
    },
    &quot;isAck&quot;: 1,
    &quot;source&quot;: &quot;BCS&quot;,
    &quot;target&quot;: &quot;NS&quot;
}
</code></pre><pre><code>// response&#x6587;&#x4EF6;
{
    &quot;cmd&quot;: &quot;response&quot;,
    &quot;cmdType&quot;: 0,
    &quot;isAck&quot;: 0,
    &quot;retCmd&quot;: &quot;realPlay&quot;,
    &quot;retCode&quot;: 200,
    &quot;retMsg&quot;: &quot;success&quot;,
    &quot;source&quot;: &quot;NS&quot;,
    &quot;target&quot;: &quot;BCS&quot;
}
</code></pre><p>&#x5176;&#x4E2D;request&#x6587;&#x4EF6;&#x662F;&#x53D1;&#x9001;&#x6D88;&#x606F;&#x7684;&#x5B9A;&#x4E49;&#xFF0C;response&#x662F;&#x56DE;&#x590D;&#x6D88;&#x606F;&#x7684;&#x5B9A;&#x4E49;&#xFF0C;&#x90A3;&#x4E48;&#x6211;&#x4EEC;&#x7684;&#x6D4B;&#x8BD5;&#x5C31;&#x662F;&#x7ED9;&#x540E;&#x53F0;&#x53D1;&#x9001;&#x4E00;&#x6761;&#x6D88;&#x606F;&#xFF0C;&#x7136;&#x540E;&#x770B;&#x770B;&#x540E;&#x53F0;&#x7ED9;&#x6211;&#x4EEC;&#x7684;&#x56DE;&#x590D;&#x6D88;&#x606F;&#x662F;&#x5426;&#x4E0E;response&#x5B9A;&#x4E49;&#x7684;&#x4E00;&#x6837;&#xFF0C;&#x4E00;&#x6837;&#x5219;&#x901A;&#x8FC7;&#xFF0C;&#x5426;&#x5219;&#x9519;&#x8BEF;&#x3002;   </p>
<p></p><h3 id="42">4.2.&#x5982;&#x4F55;&#x5B9E;&#x73B0;&#x7684;</h3><br>&#x90A3;&#x4E48;&#x6211;&#x4EEC;&#x9996;&#x5148;&#x662F;&#x628A;&#x4E0A;&#x6587;&#x63D0;&#x5230;&#x7684;libbcs_proxy&#x5C01;&#x88C5;&#x6210;&#x4E86;&#x4E00;&#x4E2A;so&#x5E93;&#xFF0C;&#x8BE5;so&#x5E93;&#x5B9E;&#x73B0;&#x4E86;libbcs_proxy&#x6240;&#x6709;&#x7684;&#x51FD;&#x6570;&#x5B9A;&#x4E49;&#xFF0C;&#x6BD4;&#x5982;&#x5176;&#x4E2D;&#x7684;init&#x51FD;&#x6570;&#xFF1A;  <p></p>
<pre><code>int init(lua_State* L)
{
    const char * ip = luaL_checkstring(L, 1);
    LUA_NUMBER port = luaL_checknumber(L,2);
    const char * log_conf_path = luaL_checkstring(L, 3);

    S_Logger::instance()-&gt;Init(std::string(log_conf_path));

    int iport = 0;
    lua_numbertointeger(port, &amp;iport);
    proxy = new BCSProxy(ip, iport);
    ns_port_ = iport;
    ns_ip_   = std::string(ip);

    lua_pushinteger(L, 0);
    return 1;
}
</code></pre><p>&#x90A3;&#x4E48;&#x9996;&#x5148;&#x8FD9;&#x91CC;&#x5FC5;&#x987B;&#x89E3;&#x91CA;&#x4E0B;&#xFF0C;lua_State&#x662F;&#x4EC0;&#x4E48;&#x4E1C;&#x897F;&#xFF0C;&#x8FD9;&#x4E2A;lua_State&#x5C31;&#x662F;&#x865A;&#x62DF;&#x6808;&#xFF08;&#x5F88;&#x591A;&#x5730;&#x65B9;&#x4E5F;&#x79F0;&#x4E3A;Lua&#x7684;&#x865A;&#x62DF;&#x673A;&#xFF0C;&#x4F46;&#x662F;&#x8FD9;&#x662F;&#x4E0D;&#x6B63;&#x786E;&#x7684;&#xFF0C;&#x5B9E;&#x9645;&#x4E0A;&#x662F;&#x865A;&#x62DF;&#x673A;&#x4E0A;&#x7684;&#x4E00;&#x4E2A;&#x7BA1;&#x7406;&#x6267;&#x884C;&#x73AF;&#x5883;&#x7684;&#x72B6;&#x6001;&#x673A;&#xFF0C;&#x672C;&#x8D28;&#x5C31;&#x662F;&#x6211;&#x4EEC;&#x540E;&#x671F;&#x67B6;&#x6784;&#x5E08;&#x4F1A;&#x8BB2;&#x5230;&#x7684;&#x4E00;&#x4E2A;&#x534F;&#x7A0B;&#xFF09;&#xFF0C;&#x8FD9;&#x4E2A;&#x865A;&#x62DF;&#x6808;&#x5F88;&#x7528;&#x4E8E;Lua&#x8BED;&#x8A00;&#x548C;C/C++&#x8BED;&#x8A00;&#x4E4B;&#x95F4;&#x4EA4;&#x6362;&#x53C2;&#x6570;&#x7528;&#x7684;&#x3002;&#x6BD4;&#x5982;&#x6211;&#x4EEC;&#x7684;&#x6D4B;&#x8BD5;&#x7528;&#x4F8B;cases.lua&#x4E2D;&#xFF1A;</p>
<pre><code>lu.assertEquals(proxy.init(g_ns_ip, g_ns_port, g_ns_log_conf_path), 0);
</code></pre><p>lua&#x4EE3;&#x7801;&#x4E2D;&#x8C03;&#x7528;&#x4E86;init&#x51FD;&#x6570;&#xFF0C;&#x90A3;&#x4E48;&#x8FD9;&#x4E9B;&#x53C2;&#x6570;g_ns_ip&#x3001;g_ns_port&#x548C;g_ns_log_conf_path&#x5C31;&#x662F;&#x5728;&#x6267;&#x884C;lua&#x8BED;&#x8A00;&#x65F6;&#x9996;&#x5148;&#x538B;&#x5165;&#x5230;lua_Stata&#x8FD9;&#x4E2A;&#x865A;&#x62DF;&#x6808;&#x7684;&#xFF1B;&#x90A3;&#x4E48;init&#x51FD;&#x6570;&#x662F;&#x5982;&#x4F55;&#x83B7;&#x53D6;&#x5230;&#x8FD9;&#x4E9B;&#x53C2;&#x6570;&#x7684;&#x5462;&#xFF1F;&#x90A3;&#x4E48;Lua&#x63D0;&#x4F9B;&#x4E86;&#x5F88;&#x591A;&#x7684;C API&#x6765;&#x83B7;&#x53D6;&#x8FD9;&#x4E9B;&#x865A;&#x62DF;&#x6808;&#x7684;&#x5185;&#x5BB9;&#xFF0C;&#x8BE6;&#x60C5;&#x53EF;&#x4EE5;&#x53C2;&#x8003;&#x5B98;&#x65B9;&#x7684;<a href="http://www.runoob.com/manual/lua53doc/contents.html#contents" target="_blank">&#x53C2;&#x8003;&#x624B;&#x518C;</a>&#xFF0C;&#x90E8;&#x5206;API&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code>void luaL_checkany (lua_State *L, int arg);   
lua_Integer luaL_checkinteger (lua_State *L, int arg);   
const char *luaL_checklstring (lua_State *L, int arg, size_t *l);   
lua_Number luaL_checknumber (lua_State *L, int arg);    
const char *luaL_checkstring (lua_State *L, int arg);    
void *luaL_checkudata (lua_State *L, int arg, const char *tname);
</code></pre><p>&#x6BD4;&#x5982;init&#x51FD;&#x6570;&#x7684;&#x5B9A;&#x4E49;&#x91CC;&#x5C31;&#x4F7F;&#x7528;&#x4E86;luaL_checkstring(L, 1)&#x83B7;&#x53D6;&#x7B2C;&#x4E00;&#x4E2A;&#x53C2;&#x6570;g_ns_ip&#x7684;&#x503C;&#xFF0C;&#x5927;&#x5BB6;&#x6CE8;&#x610F;&#x865A;&#x62DF;&#x6808;&#x5165;&#x6808;&#x7684;&#x65B9;&#x5411;&#x554A;&#x3002;&#x90A3;&#x4E48;&#x8C03;&#x7528;&#x5B8C;&#x4E86;&#x4E4B;&#x540E;&#xFF0C;init&#x51FD;&#x6570;&#x7684;&#x8FD4;&#x56DE;&#x503C;&#x5982;&#x4F55;&#x4F20;&#x9012;&#x7ED9;lua&#x5462;&#xFF1F;&#x8FD8;&#x662F;&#x901A;&#x8FC7;&#x865A;&#x62DF;&#x6808;&#x6765;&#x8FDB;&#x884C;&#x7684;&#xFF0C;&#x6BD4;&#x5982;init&#x51FD;&#x6570;&#x5C31;&#x662F;&#x901A;&#x8FC7;lua_pushinteger&#x628A;&#x4E00;&#x4E2A;0&#x503C;&#x653E;&#x5165;&#x4E86;&#x865A;&#x62DF;&#x6808;&#xFF0C;&#x6700;&#x540E;&#x5728;&#x6211;&#x4EEC;&#x7684;case&#x91CC;&#x901A;&#x5224;&#x65AD;&#x8FD4;&#x56DE;&#x503C;&#x662F;&#x5426;&#x4E3A;0&#x8868;&#x793A;&#x662F;&#x5426;&#x8C03;&#x7528;init&#x51FD;&#x6570;&#x6210;&#x529F;&#x3002;&#x90A3;&#x5165;&#x6808;&#x7684;C API&#x6709;&#x54EA;&#x4E9B;&#x5462;&#xFF1F;    </p>
<pre><code>void lua_pushboolean (lua_State *L, int b);    
void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n);    
void lua_pushcfunction (lua_State *L, lua_CFunction f);    
const char *lua_pushfstring (lua_State *L, const char *fmt, ...);    
void lua_pushinteger (lua_State *L, lua_Integer n);     
void lua_pushlightuserdata (lua_State *L, void *p);     
void lua_pushnumber (lua_State *L, lua_Number n);     
const char *lua_pushstring (lua_State *L, const char *s);
</code></pre><p>&#x4EE5;&#x4E0A;&#x8FD9;&#x4E9B;&#x89E3;&#x51B3;&#x4E86;C/C++&#x548C;lua&#x4E4B;&#x95F4;&#x4F20;&#x9012;&#x53C2;&#x6570;&#x7684;&#x95EE;&#x9898;&#x4E86;&#xFF0C;&#x90A3;&#x4E48;&#x6211;&#x4EEC;&#x518D;&#x6765;&#x770B;&#x770B;init&#x51FD;&#x6570;&#x5B9E;&#x73B0;&#xFF0C;&#x6700;&#x540E;&#x4E00;&#x5B9A;&#x8981;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x5927;&#x4E8E;0&#x7684;&#x503C;&#xFF0C;&#x6B64;&#x5904;&#x8FD4;&#x56DE;&#x7684;1&#xFF0C;&#x8868;&#x793A;&#x6211;&#x4EEC;&#x7684;&#x8FD4;&#x56DE;&#x503C;&#x4E2A;&#x6570;&#x662F;1&#x4E2A;&#x3002;</p>
<p>&#x6700;&#x540E;&#x6700;&#x91CD;&#x8981;&#x7684;&#x6765;&#x4E86;&#xFF0C;&#x6211;&#x4EEC;&#x8FD9;&#x4E9B;C&#x51FD;&#x6570;&#x5B9A;&#x4E49;&#x540E;&#xFF0C;&#x88AB;&#x7F16;&#x8BD1;&#x6210;&#x4E86;so&#x5E93;&#xFF0C;&#x90A3;&#x4E48;&#x6211;&#x4EEC;&#x7684;Lua&#x89E3;&#x91CA;&#x5668;&#x662F;&#x5982;&#x4F55;&#x627E;&#x5230;&#x8FD9;&#x4E9B;&#x51FD;&#x6570;&#x7684;&#x5462;&#xFF1F;&#x8BF7;&#x770B;&#x5B9E;&#x73B0;&#xFF1A;    </p>
<pre><code>extern &quot;C&quot; int luaopen_libbcs_proxy(lua_State* L)
{
    static const luaL_Reg functions[] =
    {
        {&quot;load&quot;, &amp;load},
        {&quot;init&quot;, &amp;init},
        {&quot;run&quot;, &amp;run},
        {&quot;uninstall&quot;, &amp;uninstall},
        {&quot;create_dev&quot;, &amp;create_dev},
        {&quot;check_dev_recvd&quot;, &amp;check_dev_recvd},
        {&quot;check_dev_recvd2&quot;, &amp;check_dev_recvd2},
        {&quot;dev_send_msg_to_ns&quot;, &amp;dev_send_msg_to_ns},
        {&quot;disable_dev_send_heartbeat&quot;, &amp;disable_dev_send_heartbeat},
        {&quot;disable_dev_send_response&quot;, &amp;disable_dev_send_response},
        {NULL,NULL}  // &#x4E00;&#x5B9A;&#x8981;&#x4EE5;{NULL,NULL}
    };

    luaL_newlib(L,functions);
    return 1;
}
</code></pre><p>&#x6211;&#x4EEC;&#x4E00;&#x5B9A;&#x8981;&#x5B9E;&#x73B0;&#x8FD9;&#x4E2A;&#x51FD;&#x6570;&#xFF0C;&#x800C;&#x4E14;&#x683C;&#x5F0F;&#x8981;&#x4E25;&#x683C;&#x4E00;&#x6837;&#xFF0C;&#x6BD4;&#x5982;luaopen_so&#x5E93;&#x540D;&#x79F0;&#xFF0C;&#x8FD9;&#x6837;&#x5728;lua&#x4E2D;&#x8C03;&#x7528;requre&#x52A0;&#x8F7D;&#x8FD9;&#x4E2A;so&#x5E93;&#x65F6;&#xFF0C;&#x4F1A;&#x8C03;&#x7528;&#x5230;&#x8BE5;&#x51FD;&#x6570;&#xFF0C;&#x4E14;&#x5728;&#x8FD9;&#x4E2A;&#x51FD;&#x6570;&#x91CC;&#x4F7F;&#x7528;luaL_Reg&#x5BFC;&#x51FA;C&#x8BED;&#x8A00;&#x5B9A;&#x4E49;&#x7684;&#x51FD;&#x6570;&#xFF0C;&#x6700;&#x540E;&#x8C03;&#x7528;luaL_newlib&#x628A;&#x8BE5;&#x51FD;&#x6570;&#x8868;&#x6DFB;&#x52A0;&#x5230;&#x865A;&#x62DF;&#x6808;&#x4E0A;&#xFF0C;lua&#x901A;&#x8FC7;&#x865A;&#x62DF;&#x6808;&#x627E;&#x5230;&#x8FD9;&#x6837;&#x7684;&#x51FD;&#x6570;&#xFF0C;&#x53D1;&#x8D77;&#x8C03;&#x7528;&#xFF0C;&#x518D;&#x4E00;&#x6B21;&#x6211;&#x4EEC;&#x770B;&#x5230;&#x4E86;lua&#x662F;&#x4F7F;&#x7528;Lua_State&#x4E0E;C/C++&#x4EA4;&#x6362;&#x6570;&#x636E;&#x7684;&#x3002;</p>
<p></p><h3 id="43">4.3.Luaunit&#x7684;&#x4F7F;&#x7528;</h3>
<a href="https://github.com/bluebird75/luaunit" target="_blank">luaunit</a>&#x662F;&#x4E00;&#x4E2A;lua&#x8BED;&#x8A00;&#x4E2D;&#x975E;&#x5E38;&#x6D41;&#x884C;&#x7684;&#x6D4B;&#x8BD5;&#x6846;&#x67B6;&#xFF0C;&#x4ED6;&#x652F;&#x6301;&#x5F88;&#x591A;&#x683C;&#x5F0F;&#x7684;&#x6D4B;&#x8BD5;&#x62A5;&#x544A;&#x8F93;&#x51FA;&#xFF0C;&#x8FD9;&#x4E9B;&#x683C;&#x5F0F;&#x5316;&#x7684;&#x8F93;&#x51FA;&#x53EF;&#x4EE5;&#x5F88;&#x597D;&#x7684;&#x5229;&#x7528;&#x4E8E;&#x6301;&#x7EED;&#x96C6;&#x6210;&#x6846;&#x67B6;&#xFF0C;&#x6BD4;&#x5982;Jenkins&#xFF0C;Hudson&#x7B49;&#x7B49;&#x3002;&#x90A3;&#x5982;&#x4F55;&#x4F7F;&#x7528;&#x5462;&#xFF1F;   <p></p>
<ul>
<li>step 1 : &#x5728;&#x6211;&#x4EEC;&#x7684;&#x6D4B;&#x8BD5;&#x6E90;&#x7801;&#x6587;&#x4EF6;&#x4E2D;&#xFF0C;&#x6BD4;&#x5982;cases.lua&#x6587;&#x4EF6;&#xFF0C;&#x5728;&#x8BE5;&#x6587;&#x4EF6;&#x4E2D;&#x9996;&#x5148;&#x5305;&#x542B;luaunit.lua&#x6587;&#x4EF6;   <pre><code>lu = require(&apos;luaunit&apos;)
</code></pre></li>
<li>step 2 : &#x5176;&#x6B21;&#x5728;&#x6587;&#x4EF6;&#x7684;&#x6700;&#x540E;&#x5199;&#x4E0A;&#x4E0B;&#x5217;&#x8BED;&#x53E5;&#x53BB;&#x6267;&#x884C;&#x8BE5;cases.lua&#x4E2D;&#x5B9E;&#x73B0;&#x7684;&#x6D4B;&#x8BD5;&#x7528;&#x4F8B;&#xFF1B;   <pre><code>os.exit( luaunit.LuaUnit.run() )
</code></pre></li>
<li>step 3 : &#x5199;&#x6D4B;&#x8BD5;&#x7528;&#x4F8B;&#xFF0C;&#x5982;&#x4E0B;&#xFF0C;&#x5FC5;&#x987B;&#x4EE5;test&#x5F00;&#x5934;&#x53BB;&#x547D;&#x540D;&#x6D4B;&#x8BD5;&#x7528;&#x4F8B;&#x3002;    </li>
</ul>
<pre><code>function testAdder()
    f = adder(3)
    luaunit.assertIsFunction( f )
    luaunit.assertEquals( f(2), 5 )
end
</code></pre><p>&#x4E5F;&#x53EF;&#x4EE5;&#x5199;&#x6D4B;&#x8BD5;&#x5957;&#xFF0C;&#x6D4B;&#x8BD5;&#x5957;&#x5C31;&#x662F;&#x591A;&#x4E2A;&#x76F8;&#x5173;&#x6D4B;&#x8BD5;&#x7528;&#x4F8B;&#x7684;&#x4E00;&#x4E2A;&#x5206;&#x7EC4;&#xFF0C;&#x6D4B;&#x8BD5;&#x5957;&#x652F;&#x6301;setup&#x548C;teardown&#x65B9;&#x6CD5;&#x3002;    </p>
<pre><code>package.cpath = package.cpath .. &quot;;/usr/local/lib/?.so&quot;

require(&apos;interface_BRKService&apos;)
require(&apos;TSocket&apos;)
require(&apos;TBufferedTransport&apos;)
require(&apos;TFramedTransport&apos;)
require(&apos;THttpTransport&apos;)
require(&apos;TCompactProtocol&apos;)
require(&apos;TJsonProtocol&apos;)
require(&apos;TBinaryProtocol&apos;)
require(&apos;liblualongnumber&apos;)

-- import luaunit
local lu = require(&apos;luaunit&apos;)

local client

local opt = {
    host      = &apos;47.106.79.26&apos;,
    port      = &apos;9090&apos;,
    protocol  = TCompactProtocol,
    transport = TFramedTransport
}

TestProtocol = {}

function TestProtocol:setUp()
    local socket = TSocket:new{
        host = opt.host,
        port = tonumber(opt.port),
        timeout = 5000
    }
    assert(socket, &apos;Failed to create client socket&apos;)

    local transport = opt.transport:new{
        trans = socket,
        isServer = false
    }

    local protocol = opt.protocol:new{
        trans = transport
    }
    assert(protocol, &apos;Failed to create binary protocol&apos;)

    client = BRKServiceClient:new{
        protocol = protocol
    }
    assert(client, &apos;Failed to create client&apos;)

    -- Open the transport
    local status, _ = pcall(transport.open, transport)
    assert(status, &apos;Failed to connect to serverle_code&apos;)
end

function TestProtocol:test_brk_list_travel_success()
     --print( &quot;called this unit case&quot;)
     local r = client:brk_list_travel(&apos;15200599665&apos;)
     lu.assertEquals(r.resultCode, 200)
     lu.assertIsTrue(r.mileage &gt; 0)
     lu.assertIsTrue(r.discharge &gt; 0)
     lu.assertIsTrue(r.calorie &gt; 0)
     local mileage = &quot;mileage is &quot; .. r.mileage
     print(mileage)
     local discharge = &quot;discharge is &quot; .. r.discharge
     print(discharge)
     local calorie = &quot;r.calorie is &quot; .. r.calorie 
     print(calorie)
end

function TestProtocol:tearDown()
    if client then
        -- close the connection
        client:close()
    end
end

local runner = lu.LuaUnit.new()
runner:setOutputType(&quot;tap&quot;)
os.exit( runner:runSuite() )
</code></pre><p>&#x4ECE;&#x4E0A;&#x9762;&#x7684;&#x4EE3;&#x7801;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x770B;&#x51FA;&#x5728;setup&#x5EFA;&#x7ACB;&#x6D4B;&#x8BD5;&#x73AF;&#x5883;&#xFF08;&#x51C6;&#x5907;&#x901A;&#x8BAF;&#xFF09;&#xFF0C;&#x5728;teardown&#x8D1F;&#x8D23;&#x5BF9;&#x6D4B;&#x8BD5;&#x73AF;&#x5883;&#x7684;&#x6E05;&#x7406;&#xFF0C;&#x6BD4;&#x5982;&#x6211;&#x4EEC;&#x8FD9;&#x91CC;&#x65AD;&#x5F00;&#x901A;&#x8BAF;&#x3002;</p>
<ul>
<li>step 4 &#xFF1A;&#x8FD0;&#x884C;&#x6D4B;&#x8BD5;&#x7528;&#x4F8B;   </li>
</ul>
<pre><code>lua cases.lua
</code></pre><p>&#x8FD0;&#x884C;&#x6D4B;&#x8BD5;&#x7528;&#x4F8B;&#x53EF;&#x4EE5;&#x6709;&#x4E00;&#x4E9B;&#x53C2;&#x6570;&#xFF1A;</p>
<pre><code>* -o : &#x6307;&#x5B9A;&#x6D4B;&#x8BD5;&#x62A5;&#x544A;&#x8F93;&#x51FA;&#x683C;&#x5F0F;&#xFF0C;&#x5982;&#x4EE5;&#x4E0B;&#x683C;&#x5F0F;&#xFF1A;
 text: the default output format
 nil: no output at all
 TAP: TAP format
 junit: output junit xml
* -p &#xFF1A;&#x6311;&#x9009;&#x6D4B;&#x8BD5;&#x7528;&#x4F8B;&#x6267;&#x884C;&#xFF0C;&#x540E;&#x9762;&#x8DDF;&#x6D4B;&#x8BD5;&#x7528;&#x4F8B;&#x540D;&#x79F0;
</code></pre><h2 id="5">5.C/C++&#x8C03;&#x7528;lua&#x4EE3;&#x7801;</h2>

<p><strong>&#x4F5C;&#x4E1A;1&#xFF1A;brks&#x5DE5;&#x7A0B;&#x6240;&#x6709;&#x7684;&#x914D;&#x7F6E;&#x4FE1;&#x606F;&#x653E;&#x5165;lua&#x811A;&#x672C;&#x91CC;&#xFF0C;&#x7136;&#x540E;brks&#x5DE5;&#x7A0B;&#x4ECE;lua&#x811A;&#x672C;&#x4E2D;&#x83B7;&#x53D6;&#x914D;&#x7F6E;&#x4FE1;&#x606F;&#xFF0C;&#x6BD4;&#x5982;&#x4E0B;&#x5217;&#x4EE3;&#x7801;&#x4E2D;&#x7684;&#xFF1A;</strong>    </p>
<pre><code>int main(int argc, char** argv)
{
    if (argc != 2)
    {
        printf(&quot;please input brks &lt;log file config&gt;!\n&quot;);
        return -1;
    }

    if(!Logger::instance()-&gt;init(std::string(argv[1])))
    {
        printf(&quot;init log module failed.\n&quot;);
        return -1;
    }
    else
    {
        printf(&quot;init log module success!&quot;);
    }

    std::shared_ptr&lt;DispatchMsgService&gt; dms(new DispatchMsgService);
    dms-&gt;open();

    std::shared_ptr&lt;MysqlConnection&gt; mysqlconn(new MysqlConnection);
    mysqlconn-&gt;Init(&quot;127.0.0.1&quot;, 3306, &quot;root&quot;, &quot;123456&quot;, &quot;dongnaobike&quot;);

    BusinessProcessor processor(dms, mysqlconn);
    processor.init();

    std::function&lt; iEvent* (const iEvent*)&gt; fun = std::bind(&amp;DispatchMsgService::process, dms.get(), std::placeholders::_1);

    Interface intf(fun);
    intf.start(9090);

    LOG_INFO(&quot;brks start successful!&quot;);

    for(;;);

    return 0;
}
</code></pre><p>&#x628A;&#x4E0A;&#x9762;&#x4EE3;&#x7801;&#x7684;&#x6570;&#x636E;&#x5E93;&#x7684;&#x4FE1;&#x606F;ip&#xFF0C;&#x7AEF;&#x53E3;&#x53F7;&#xFF0C;&#x8D26;&#x6237;&#xFF0C;&#x5BC6;&#x7801;&#x548C;&#x6570;&#x636E;&#x5E93;&#x540D;&#x79F0;&#x653E;&#x5165;lua&#x811A;&#x672C;&#x4E2D;&#xFF0C;&#x8FD8;&#x6709;brks&#x76D1;&#x542C;&#x7684;&#x7AEF;&#x53E3;&#x4E5F;&#x653E;&#x5165;lua&#x6587;&#x4EF6;&#x4E2D;&#x3002;</p>
<p>**&#x4F5C;&#x4E1A;2&#xFF1A;&#x6211;&#x4EEC;&#x73B0;&#x5728;&#x7684;&#x6D4B;&#x8BD5;&#x6846;&#x67B6;&#x662F;&#x4F7F;&#x7528;thrift&#x751F;&#x6210;&#x7684;lua&#x4EE3;&#x7801;&#x5F00;&#x53D1;&#x7684;&#xFF0C;&#x90A3;&#x4E48;&#x628A;&#x8FD9;&#x4E2A;&#x6846;&#x67B6;&#x6539;&#x6210;thrift&#x751F;&#x6210;cpp&#x6587;&#x4EF6;&#xFF0C;&#x628A;&#x8FD9;&#x4E2A;cpp&#x6587;&#x4EF6;&#x5C01;&#x88C5;&#x6210;so&#x6587;&#x4EF6;&#xFF0C;lua&#x8C03;&#x7528;so&#x5E93;&#x7684;&#x63A5;&#x53E3;&#x53BB;&#x5199;&#x6D4B;&#x8BD5;&#x7528;&#x4F8B;&#x3002;&#x8981;&#x6C42;&#x6D88;&#x606F;&#x5185;&#x5BB9;&#x5B9A;&#x4E49;&#x6210;json&#x6587;&#x4EF6;&#xFF08;&#x6BD4;&#x5982;request.json&#xFF09;&#xFF0C;&#x540E;&#x53F0;&#x53CD;&#x9988;&#x7684;&#x6D88;&#x606F;&#x4E5F;&#x4E0E;&#x6211;&#x4EEC;&#x5B9A;&#x4E49;&#x7684;json&#x6587;&#x4EF6;&#xFF08;&#x6BD4;&#x5982;response.json&#xFF09;&#x8FDB;&#x884C;&#x6BD4;&#x5BF9;&#xFF0C;&#x5982;&#x679C;&#x4E00;&#x81F4;&#x5219;&#x8BF4;&#x660E;&#x540E;&#x53F0;&#x5904;&#x7406;&#x6D88;&#x606F;&#x6210;&#x529F;&#xFF0C;&#x5426;&#x5219;&#x5931;&#x8D25;&#x3002;</p>

                    
                    </section>
                
                
                </div>
            </div>
        </div>

        
        <a href="../chapter5/index.html" class="navigation navigation-prev " aria-label="Previous page: 持续集成"><i class="fa fa-angle-left"></i></a>
        
        
        <a href="../chapter5/5.2_gtest单元测试.html" class="navigation navigation-next " aria-label="Next page: gtest单元测试"><i class="fa fa-angle-right"></i></a>
        
    </div>
</div>

        
<script src="../gitbook/app.js"></script>

    
    <script src="../gitbook/plugins/gitbook-plugin-search/lunr.min.js"></script>
    

    
    <script src="../gitbook/plugins/gitbook-plugin-search/search.js"></script>
    

    
    <script src="../gitbook/plugins/gitbook-plugin-sharing/buttons.js"></script>
    

    
    <script src="../gitbook/plugins/gitbook-plugin-fontsettings/buttons.js"></script>
    

    
    <script src="../gitbook/plugins/gitbook-plugin-livereload/plugin.js"></script>
    

<script>
require(["gitbook"], function(gitbook) {
    var config = {"theme-default":{"showLevel":false},"highlight":{},"search":{"maxIndexSize":1000000},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"fontsettings":{"theme":"white","family":"sans","size":2},"livereload":{}};
    gitbook.start(config);
});
</script>

        
    </body>
    
</html>
